////////////////////////////////////////////////////////////////////////////////

#ifndef _CLIENTINPUT_H_
#include "clientinput.h"
#endif

////////////////////////////////////////////////////////////////////////////////

#ifndef _BUFFER_H_
#include "buffer.h"
#endif

////////////////////////////////////////////////////////////////////////////////


ClientInput::ClientInput()
{
    Reset();
}


////////////////////////////////////////////////////////////////////////////////


ClientInput::ClientInput( Buffer& _buffer )
{
}


////////////////////////////////////////////////////////////////////////////////


ClientInput::~ClientInput()
{
}

////////////////////////////////////////////////////////////////////////////////


void ClientInput::Reset()
{
    m_IsUpPressed = false;
    m_IsDownPressed = false;
    m_IsLeftPressed = false;
    m_IsRightPressed = false;
    m_IsShootPressed = false;
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::IsUpPressed() const
{
    return m_IsUpPressed;
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::IsDownPressed() const
{
    return m_IsDownPressed;
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::IsLeftPressed() const
{
    return m_IsLeftPressed;
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::IsRightPressed() const
{
    return m_IsRightPressed;
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::IsShootPressed() const
{
    return m_IsShootPressed;
}


////////////////////////////////////////////////////////////////////////////////


void ClientInput::SetUpPressed( bool _isPressed )
{
    m_IsUpPressed = _isPressed;
}


////////////////////////////////////////////////////////////////////////////////


void ClientInput::SetDownPressed( bool _isPressed )
{
    m_IsDownPressed = _isPressed;
}


////////////////////////////////////////////////////////////////////////////////


void ClientInput::SetLeftPressed( bool _isPressed )
{
    m_IsLeftPressed = _isPressed;
}


////////////////////////////////////////////////////////////////////////////////


void ClientInput::SetRightPressed( bool _isPressed )
{
    m_IsRightPressed = _isPressed;
}


////////////////////////////////////////////////////////////////////////////////


void ClientInput::SetShootPressed( bool _isPressed )
{
    m_IsShootPressed = _isPressed;
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::IsGoingUp() const
{
    return IsUpPressed() && !IsDownPressed();
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::IsGoingDown() const
{
    return IsDownPressed() && !IsUpPressed();
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::IsGoingLeft() const
{
    return IsLeftPressed() && !IsRightPressed();
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::IsGoingRight() const
{
    return IsRightPressed() && !IsLeftPressed();
}


////////////////////////////////////////////////////////////////////////////////


const Point& ClientInput::GetMousePosition() const
{
    return m_MousePosition;
}


////////////////////////////////////////////////////////////////////////////////


void ClientInput::SetMousePosition( const Point& _position )
{
    m_MousePosition = _position;
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::ActionsChanged( const ClientInput& _prevInput ) const
{
    return _prevInput.IsDownPressed() != m_IsDownPressed ||
           _prevInput.IsUpPressed() != m_IsUpPressed ||
           _prevInput.IsLeftPressed() != m_IsLeftPressed ||
           _prevInput.IsShootPressed() != m_IsShootPressed ||
           _prevInput.IsRightPressed() != m_IsRightPressed;
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::MousePositionChanged( const ClientInput& _prevInput ) const
{
    return !( m_MousePosition == _prevInput.GetMousePosition() );
}


////////////////////////////////////////////////////////////////////////////////


unsigned int ClientInput::GetActions() const
{
    unsigned int actions = 0;

    if (m_IsDownPressed)
        actions |= DOWN;

    if (m_IsUpPressed)
        actions |= UP;

    if (m_IsLeftPressed)
        actions |= LEFT;

    if (m_IsRightPressed)
        actions |= RIGHT;

    if (m_IsShootPressed)
        actions |= SHOOT;

    return actions;
}


////////////////////////////////////////////////////////////////////////////////


void ClientInput::SetActions( unsigned int _actions )
{
    m_IsDownPressed  = ( (_actions & DOWN ) != 0 );
    m_IsUpPressed    = ( (_actions & UP   ) != 0 );
    m_IsLeftPressed  = ( (_actions & LEFT ) != 0 );
    m_IsRightPressed = ( (_actions & RIGHT) != 0 );
    m_IsShootPressed = ( (_actions & SHOOT) != 0 );
}


////////////////////////////////////////////////////////////////////////////////


bool ClientInput::InputChanged( const ClientInput& _prevInput ) const
{
    return ActionsChanged(_prevInput) || MousePositionChanged(_prevInput);
}


////////////////////////////////////////////////////////////////////////////////
